package controller.xml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

import sim_moteur.Terrain;
import vue.Affichable;
import controleur.Controleur;
import controleur.SimulationControllerThread;

public class ControllerXML {
	private static final String ABSOLUTE_PATH = "./output/";
	private Controleur controleur;
	private File outputFolder = null;
	private String nomScenario = null;

	public ControllerXML(Controleur controleur) {

		this.controleur = controleur;

	}

	/**
	 * Initialise le controller de fichiers XML
	 * 
	 * @param nom
	 *            le nom du nouveau scénario
	 * @param nombreSim
	 *            le nombre de simulateurs impliqués
	 */
	public void init(String nom, int nombreSim) {

		this.nomScenario = nom;

		outputFolder = new File(ABSOLUTE_PATH + nomScenario);

		deleteFolder(outputFolder);

		outputFolder.mkdirs();
	}

	public void writeXML(int noStep, SimulationControllerThread simController)
			throws XMLStreamException, FileNotFoundException {

		// Fichier de sortis XML
		FileOutputStream output = new FileOutputStream(ABSOLUTE_PATH
				+ nomScenario + "/step" + noStep + ".xml");

		// Fabrique pour XML
		XMLOutputFactory fabrique = XMLOutputFactory.newInstance();

		// Flux d'écriture XML
		XMLStreamWriter writer = fabrique.createXMLStreamWriter(output);

		// Début du document
		writer.writeStartDocument();

		// Ouverture de simualteur
		writer.writeStartElement("simulateur");

		writer.writeAttribute("xmlns:xsi",
				"http://www.w3.org/2001/XMLSchema-instance");
		writer.writeAttribute("xsi:schemaLocation",
				"http://www.example.org/cegep cegep.xsd ");
		writer.writeAttribute("numeroPasTemps", Integer.toString(noStep));
		writer.writeAttribute("nomScenario", nomScenario);
		writer.writeAttribute("dimensionTerrainX",
				Integer.toString(Terrain.getInstance().getXSize()));
		writer.writeAttribute("dimensionTerrainY",
				Integer.toString(Terrain.getInstance().getYSize()));
		writer.writeStartElement("element");

		// Ouverture de vivant
		writer.writeStartElement("vivant");

		for (Affichable animaux : simController.getAnimaux()) {
			writer.writeStartElement("animal");
			writer.writeAttribute("coordX",
					Integer.toString(animaux.getCoordonnees().getX()));
			writer.writeAttribute("coordY",
					Integer.toString(animaux.getCoordonnees().getY()));
			writer.writeAttribute("vie", Float.toString(animaux.getVie()));
			writer.writeCharacters(animaux.getName());
			writer.writeEndElement();
		}

		for (Affichable vegetaux : simController.getVegetaux()) {
			writer.writeStartElement("vegetal");
			writer.writeAttribute("coordX",
					Integer.toString(vegetaux.getCoordonnees().getX()));
			writer.writeAttribute("coordY",
					Integer.toString(vegetaux.getCoordonnees().getY()));
			writer.writeAttribute("vie", Float.toString(vegetaux.getVie()));
			writer.writeCharacters(vegetaux.getName());
			writer.writeEndElement();
		}

		// Fermeture de vivant
		writer.writeEndElement();

		for (Affichable choses : simController.getLesChosesBasiques()) {
			writer.writeStartElement("choses");
			writer.writeAttribute("coordX",
					Integer.toString(choses.getCoordonnees().getX()));
			writer.writeAttribute("coordY",
					Integer.toString(choses.getCoordonnees().getY()));
			writer.writeEndElement();
		}

		// Fermeture d'élément
		writer.writeEndElement();

		// Fermeture de simulateur
		writer.writeEndElement();
		writer.writeEndDocument();
		writer.flush();
		writer.close();
		try {
			output.flush();
			output.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * détruit tous les dossiers de façon récurrente
	 * 
	 * @param folder
	 *            le dossier à détruire
	 */
	public static void deleteFolder(File folder) {
		File[] fichiers = folder.listFiles();
		if (fichiers != null) { // some JVMs return null for empty dirs
			for (File fichier : fichiers) {
				if (fichier.isDirectory()) {
					deleteFolder(fichier);
				} else {
					fichier.delete();
				}
			}
		}
		folder.delete();
	}

}
